#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
#include <string>
#include<memory>
// class A
// {

// public:
//     A(int a = 0):_a(a){}
//     int _a;
//     ~A(){
//         cout << "~A()" << endl;
//     }
// };
// void* run(void* args){
//     A* a = static_cast<A*>(args);
//     try {
//         int b = 4/0;
//     }
//     catch(const exception& e){
//         cout << e.what() << endl;
//     }
//     catch(...){

//     }
//     return nullptr;
// }

// int main(){
//     A a(10);
//     pthread_t pid;
//     try 
//     {
//         pthread_create(&pid,nullptr,run,(void*)&a);
//     }
//     catch(...){
//         cout << "线程异常" << endl;
//     }
//     void* ret;
//     int n = pthread_join(pid,&ret);
//     if (n != 0){
//         std::cout << "等待失败" << " n: "  << n << std::endl;
//         return 1;
//     }
//     std::cout << "等待成功" << std::endl;
//     cout << ret << endl;
//     cout << &a << endl;
//     cout << a._a << endl;
//     // cout << ((shared_ptr<A>*)ret)->get()->_a << endl;
//     return 0;
// }

// int main(){
//     shared_ptr<A> a = make_shared<A>(10);
//     a->_a;
//     shared_ptr<A>* ptr = &a;
//     return 0;
// }

// int val = 100;
// #define NUM 10
// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }
// string Name;
// void* run(void* args){
//     std::string name = static_cast<const char*>(args);
//     // while(true){
//     //     std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self())  << std::endl;
//     //     sleep(1);
//     //     //单独退出进程
//     // }
//     Name = name;
//     return nullptr;
// }
// int main(){
//     pthread_t pid;
//     pthread_create(&pid,nullptr,run,(void*)"thread-1");
//     std::cout << "I am main thread, id is : " << toHex(pthread_self())  << std::endl;
//     sleep(2);

//     pthread_cancel(pid);

//     cout << "新线程取消了, 地址还在吗? " << toHex(pid) << endl;
//     void* ret;
//     int n = pthread_join(pid,&ret);
//     if (n != 0){
//         std::cout << "等待失败" << " n: "  << n << std::endl;
//         return 1;
//     }
//     std::cout << "等待成功" << std::endl;
//     cout << ret << endl;
//     cout << Name << endl;
//     return 0;
// }
// class ThreadData
// {
// public:
//     ThreadData() {}
//     ~ThreadData() {}
//     void Init(const std::string &name, int a, int b)
//     {
//         _name = name;
//         _a = a;
//         _b = b;
//     }
//     std::string Name() { return _name; }
//     void Excute() { _result = _a + _b; }
//     int Result() { return _result; }
//     int A() { return _a; }
//     int B() { return _b; }

// private:
//     std::string _name;
//     int _a;
//     int _b;
//     int _result;
// };
// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }
// void *run(void *args)
// {
//     ThreadData *d = static_cast<ThreadData *>(args);
//     std::cout << "I am " << d->Name() << std::endl;
//     d->Excute();
//     return (void *)d;
// }
// int main()
// {
//     pthread_t pid;
//     ThreadData data;
//     data.Init("线程1",10,20);
//     pthread_create(&pid, nullptr, run, (void *)(&data));

//     std::cout << "I am main thread " << std::endl;

//     void *ret;
//     int n = pthread_join(pid, nullptr);
//     std::cout << data.Result() << std::endl;

//     return 0;
// }
// int val = 100;
// const int NUM = 10;
// std::string toHex(pthread_t pid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof(buffer), "0x%lx", pid);
//     return buffer;
// }
// void *run(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     std::cout << "I am " << name << ", thread id is : " << toHex(pthread_self()) << std::endl;
//     return (void*)10;
// }
// int main()
// {
//     pthread_t pid[NUM];
//     for (int i = 0; i < NUM; i++){
//         string name = "thread" + to_string(i+1);
//         pthread_create(&pid[i], nullptr, run, (void *)name.c_str());
//     }

//     std::cout << "I am main thread, id is : " << toHex(pthread_self()) << std::endl;

//     void* ret;
//     for (int i = 0; i < NUM; i++){
//         int n = pthread_join(pid[i],&ret);
//         if (n == 0){
//             cout << "等待现程成功" << endl; 
//             std::cout << "thread[" <<i+1<<"]" <<" result: " << (long long)ret << std::endl;
//         }
//         else {
//             cout << "等待失败" << endl;
//         }
//     }
//     return 0;
// }

// std::string toHex(pthread_t pid){
//     char buffer[64];
//     snprintf(buffer,sizeof(buffer),"0x%lx",pid);
//     return buffer;
// }
// void* run(void*args){
//     string name = (const char*)args;
//     while(1){
//         cout << "I am a new thread, name: " << name << " thread id: " <<toHex(pthread_self()) << endl;
//         sleep(1);
//     }
//     return nullptr;
// }
// int main(){
//     pthread_t k; //新线程的id信息
//     pthread_create(&k,nullptr,run,(void*)"thread-1");
//     cout << toHex(k) << endl;
//     while(1){
//         cout << "I am main thread" <<  ", thread id: " << toHex(pthread_self())<< endl;
//         sleep(1);
//     }
//     return 0;
// }